package leetcode;

/*
216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数，并且每种组合中不存在重复的数字。
说明：
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
*/

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class problems_216 {
    public static void main(String[] args) {
        System.out.println(new Solution().combinationSum3(3, 9));
    }

    static class Solution {
        List<List<Integer>> ret = new ArrayList<>();

        public List<List<Integer>> combinationSum3(int k, int n) {
            Stack<Integer> stack = new Stack<>();
            dfs(1, k, n, stack);
            return ret;
        }

        private void dfs(int index, int num, int target, Stack<Integer> stack) {
            if (num == 0 && target == 0) {
                ret.add((List<Integer>) stack.clone());
                return;
            }
            for (int i = index; i <= 9; i++) {
                if (target < i) {
                    break;
                }
                stack.push(i);
                dfs(i + 1, num - 1, target - i, stack);
                stack.pop();
            }
        }
    }
}